package futbol.tacticas.concursantes2007.SeteTeam.jugadores.facklab;

import futbol.tacticas.concursantes2007.SeteTeam.jugadores.geometria.*;

import java.awt.Point;

import futbol.tacticas.SituacionJugadores;


public class Entrenador {
	
	//	Referencia a los jugadores
	public static final int PORTERO      = 0;
    
	public static final int DEF_BAJO     = 1;
	public static final int DEF_MED_BAJO = 2;
	public static final int DEF_MED_ALTO = 3;
	public static final int DEF_ALTO     = 4;

	public static final int CEN_BAJO     = 5;
	public static final int CEN_MED_BAJO = 6;
	public static final int CEN_MED_ALTO = 7;
	public static final int CEN_ALTO     = 8;
	
	public static final int DEL_BAJO	 = 9;
	public static final int DEL_ALTO     = 10;

	
	
	//Posicion anterior de la bola
	private transient Point memoriaBola;
	
	//Point al que se proyecta la bola en esta iteracion
	private transient Point proyeccionBola;
	
	//linea por la que se proyecta la bola
	private transient Linea lineaBola;
	
	//Point en el que hay mas posibilidades de marcar Gol
	private transient Point PointDebilPorteria;
	
	//Contiene la instancia de la SituacionJugadores de la ultima iteracion
	private transient SituacionJugadores situacion;
	
	//Marcador
	private short[] marcador = {0,0}; 
	
	public Entrenador(){}
	
	/**
	 * Devuelve  la {@link SituacionJugadores} de la ultima iteracion
	 * @return situacion
	 */
	public SituacionJugadores getSituacion() {
		return situacion;
	}
	
	/**
	 * Metodo encargado de recoger la {@link SituacionJugadores} y hacer los calculos
	 * que posteriormente seran usados por los jugadores.
	 * 
	 * @return situacion
	 */
	public void setSituacion(final SituacionJugadores situacion) {
		this.situacion = situacion;
		setProyeccionBola(situacion.getBola());
		setPuntoDebilPorteria(situacion.getContrario()[0]);
		
		final Point bola = situacion.getBola();
		
		//Calculo si se ha marcado algun gol
		if(memoriaBola!= null && (bola.x ==0) && (memoriaBola.x>100)){
			marcador[0]++;
		}else if(memoriaBola!= null && (bola.x ==0) && (memoriaBola.x<-100)){
			marcador[1]++;
		}
		//System.out.println("A favor: "+marcador[0]+" En contra: "+marcador[1]);
		memoriaBola = situacion.getBola();
	}
	
	/**
	 * Devuelve el Point de la pared sobre el que se proyecta la bola
	 * dependiendo de su direccion y sentido  
	 * 
	 * @return proyeccionBola
	 */
	public Point getProyeccionBola() {
		return proyeccionBola;
	}
	
	/**
	 * Devuelve la {@link Linea} por la cual se mueve la bola 
	 * 
	 * @return {@link Linea}
	 */
	public Linea getLineaBola() {
		return lineaBola;
	}

	/**
	 * Calcula el Point de la pared sobre el que se proyecta la bola 
	 * @param bolaActual - el {@link Point} coresspondiente a la bola de es
	 */
	private void setProyeccionBola(final Point bolaActual) {
		
		if(memoriaBola!=null){
			try{
				lineaBola = new Linea(memoriaBola,bolaActual);
				//La proyeccion depende de el sentido de la bola
				//Estos condicionales se suprimirian con vectores
				if(bolaActual.x > memoriaBola.x ){
					Point temp =lineaBola.calcularY(160);
					if(temp.getY()>120){
						proyeccionBola = lineaBola.calcularX(120);
					}else if(temp.getY()<-120){
						proyeccionBola = lineaBola.calcularX(-120);
					}else{
						this.proyeccionBola= lineaBola.calcularY(160);
					}
				}else if(bolaActual.x < memoriaBola.x){
					Point temp =lineaBola.calcularY(-160);
					if(temp.getY()>120){
						proyeccionBola = lineaBola.calcularX(120);
					}else if(temp.getY()<-120){
						proyeccionBola = lineaBola.calcularX(-120);
					}else{
						this.proyeccionBola= lineaBola.calcularY(-160);
					}
				}else {
					if(bolaActual.y > memoriaBola.y){
						this.proyeccionBola= lineaBola.calcularX(120);
					}else if(bolaActual.y < memoriaBola.y){
						this.proyeccionBola= lineaBola.calcularX(-120);
					}else{
						this.proyeccionBola=null;
					}
				}
			}catch (ArithmeticException e) {
				this.lineaBola = null;
				this.proyeccionBola=null;
			}
		}else{
			this.lineaBola = null;
			this.proyeccionBola=null;
		}
	}

	/**
	 * Devuelve el Point de la porteria contraria en el que hay mas posibilidades 
	 * de marcar gol
	 * 
	 * @return {@link Point} 
	 */
	public Point getPuntoDebilPorteria() {
		return PointDebilPorteria;
	}
	
	/**
	 * Calcula el Point debil de la porteria contraria
	 * 
	 * @param porteroContrario - {@link Point} con la posicion del portero contrario
	 */
	private void setPuntoDebilPorteria(Point porteroContrario) {
		int temp;
		if(porteroContrario.y > 0){
			temp=porteroContrario.y-15;
		}else{
			temp=porteroContrario.y+15;
		}
		
		this.PointDebilPorteria = new Point(160,temp);
	}
	
}
